// 注意:
// 有些栈上缓冲区编译器不能正确识别，它可能会在出了编译器认为的作用域后就会退栈，导致栈无效
// 我们需要把 xvalid_before_here() 语句放在希望栈仍有效的位置，在 xvalid_before_here() 之后的位置不保证有效
#pragma once
#include"macro/xnew.hpp"
#include"macro/xunlikely.hpp"

template<uxx bytes_v>
struct __xvalid_before_here{
    u08 items[bytes_v] = {};
};

template<class item_t>
inline bool __mixc_xvalid_before_here(item_t && args){
    using xvalid_before_here_t = __xvalid_before_here<sizeof(item_t &&)>;
    xnew(& args)xvalid_before_here_t();
    return true;
}

inline void __mixc_xvalid_before_here_list(auto && ... args){
    (... and __mixc_xvalid_before_here(args));
}

#define xvalid_before_here(...)                                                         \
xunlikely(volatile bool __no_check = false; __no_check){                                \
    __mixc_xvalid_before_here_list(__VA_ARGS__);                                        \
}
